#include "myhead.h"
//搞服务器要监听状态，不用连接connect用户
//新套接字为了对应多个线程

void *func2(void *arg)
{
    int sock = *(int *)arg;
    char buf[20];
    while (1) {
        bzero(buf, sizeof(buf));
        int ret = recv(sock, buf, sizeof(buf), 0);
        if (ret <= 0) {
            perror("recv 或客户端断开");
            break;
        }
        printf("收到: %s\n", buf);
    }
    close(sock);
    return NULL;
}

void *func(void *arg) {
    int sock = *(int *)arg;
    free(arg); // 释放传进来的内存
    pthread_t tid;
    pthread_create(&tid, NULL, func2, sock);

    char buf[20];
    while (1) {
        bzero(buf, sizeof(buf));
        int ret = recv(sock, buf, sizeof(buf), 0);
        if (ret <= 0) {
            perror("recv 或客户端断开");
            break;
        }
        printf("收到: %s\n", buf);
    }
    close(sock);
    return NULL;
}

int main()
{
    int tcpsock;//套接字标识符
    tcpsock=socket(AF_INET,SOCK_STREAM,0);
    if(tcpsock==-1)
    {
        perror("创建套接字失败\n");
        return -1;
    }

    //设置ip和端口（不要小于1024）
    struct sockaddr_in bindaddr;//结构体里面要有ip和端口
    bindaddr.sin_family=AF_INET;//选择地址协议ipv4
    bindaddr.sin_addr.s_addr=inet_addr("192.168.72.52");//ip
    bindaddr.sin_port=htons(10000);//端口

    //绑定套接字ip和端口
    int ret = bind(tcpsock,(struct sockaddr *)&bindaddr,sizeof(struct sockaddr_in));
    if(ret==-1)
    {
        perror("bind");
        return -1;
    }

    //监听要接通的服务器
    ret = listen(tcpsock,10);//一般接通10以下
    if(ret==-1)
    {
        perror("listen");
        return -1;
    }

    struct sockaddr_in clientaddr;
    int size= sizeof(clientaddr);
    bzero(&clientaddr,size);

    int *newsock=NULL;
    //循环读取套接字
   while (1) 
   {
        int sock = accept(tcpsock, (struct sockaddr *)&clientaddr, &size);
        if (sock == -1) {
            perror("accept");
            continue;
        }

        int *sock_ptr = malloc(sizeof(int));
        *sock_ptr = sock;

        pthread_t tid;
        pthread_create(&tid, NULL, func, sock_ptr);
        pthread_detach(tid); // 不等待线程结束
    }
}